import html2Canvas from 'html2canvas';
import jsPDF from 'jspdf';

const methods = {}


/**
 * 将HTML富文本转换为Word文档并下载
 * @param {string} html - 转换的元素
 * @param {string} [filename='document.docx'] - 下载的文件名
 */
methods.exportHtmlToWord = (html, filename = 'document.docx') => {
  // 创建一个Blob对象，包含HTML内容
  // 创建一个Blob对象，包含HTML内容，添加了页眉页脚和图片
  // 创建一个Blob对象，包含WPS兼容的HTML内容（带页眉页脚和图片）
  const blob = new Blob([`
    <html xmlns:o="urn:schemas-microsoft-com:office:office"
          xmlns:w="urn:schemas-microsoft-com:office:word"
          xmlns:v="urn:schemas-microsoft-com:vml"
          xmlns="http://www.w3.org/TR/REC-html40">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>

        <!-- WPS/Word专用XML定义 -->
        <!--[if gte mso 9]>
        <xml>
            <w:WordDocument>
                <w:View>Print</w:View>
                <w:Zoom>100</w:Zoom>
                <w:DoNotOptimizeForBrowser/>
                <w:ValidateAgainstSchemas/>
                <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
                <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
                <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
                <w:Compatibility>
                    <w:BreakWrappedTables/>
                    <w:SnapToGridInCell/>
                    <w:WrapTextWithPunct/>
                    <w:UseAsianBreakRules/>
                </w:Compatibility>
            </w:WordDocument>
        </xml>
        <![endif]-->

        <style>
            /* 基础样式 */
            body, html {
                margin: 0;
                padding: 0;
                font-family: "Microsoft YaHei", Arial, sans-serif;
            }

            /* WPS页眉页脚核心样式 */
            @page {
                size: A4;
                margin-top: 3cm;
                margin-bottom: 2cm;
                mso-header-margin: 1.5cm; /* WPS专用页眉边距 */
                mso-footer-margin: 1.5cm; /* WPS专用页脚边距 */
                mso-header: h1;          /* 绑定页眉标识符 */
                mso-footer: f1;          /* 绑定页脚标识符 */
            }

            /* 页眉容器（WPS专用类名） */
            div.wps-header {
                position: running(h1);
                height: 2cm;
                border-bottom: 1px solid #e0e0e0;
                padding: 8px 0;
                display: flex;
                align-items: center;
            }

            /* 页脚容器（WPS专用类名） */
            div.wps-footer {
                position: running(f1);
                height: 1.8cm;
                border-top: 1px solid #e0e0e0;
                text-align: center;
                font-size: 9pt;
                padding-top: 8px;
            }

            /* 页眉图片样式 */
            .header-img {
                height: 36px;
                margin-left: 15px;
                mso-position-horizontal: inside;
            }

            /* 页眉标题样式 */
            .header-title {
                flex: 1;
                text-align: center;
                font-weight: bold;
                color: #333;
            }

            /* 页脚页码样式（WPS专用字段） */
            .wps-page {
                mso-field-code: 'PAGE';
            }

            .wps-total-pages {
                mso-field-code: 'NUMPAGES';
            }

            /* 页脚日期样式 */
            .wps-date {
                mso-field-code: 'DATE \\@ "yyyy年MM月dd日"';
            }

            /* 其他通用样式 */
            table { border-collapse: collapse; width: 100%; }
            table, th, td { border: 1px solid #ddd; }
            th, td { padding: 8px; text-align: left; }
            p { margin-bottom: 10px; line-height: 1.6; }
            h1, h2, h3 { margin: 15px 0 10px; font-weight: bold; }
        </style>
    </head>
    <body>
        <!-- WPS兼容页眉（带图片） -->
        <div class="wps-header">
            <img src="" alt="公司Logo" class="header-img">
        </div>

        <!-- 主内容区域（WPS页面分区） -->
        <div style="page: default;">
            ${html} <!-- 主内容由变量注入 -->
        </div>

        <!-- WPS兼容页脚（带页码和日期） -->
        <div class="wps-footer">
            <div>地址：重庆市江北区观音桥COSMO大厦3楼    座机：023-67718300     网址： www.webwing.cn<span class="wps-date"></span></div>
            <div>共 <span class="wps-total-pages">3</span> 页</div>
        </div>
    </body>
    </html>
`], {
    type: 'application/msword'
  });

  // 创建下载链接
  const link = document.createElement('a');
  link.href = URL.createObjectURL(blob);
  link.download = filename;

  // 触发点击事件下载文件
  document.body.appendChild(link);
  link.click();

  // 清理
  setTimeout(() => {
    document.body.removeChild(link);
    URL.revokeObjectURL(link.href);
  }, 0);
}
// 获取时间长度
methods.formatDuration = (startTime, endTime = new Date()) => {
  startTime = new Date(startTime).getTime();
  endTime = new Date(endTime).getTime();
  let ms = endTime - startTime;
  const duration = moment.duration(ms);
  let years = Math.floor(duration.asYears());
  let months = Math.floor(moment.duration(duration.asMonths() - years * 12).asMonths());
  let days = Math.floor(duration.days());
  let hours = Math.floor(duration.hours());
  let minutes = Math.floor(duration.minutes());
  let seconds = Math.floor(duration.seconds());
  let parts = [];
  if (years > 0) parts.push(years + '年');
  if (months > 0 || years > 0) parts.push(months + '月'); // 只有在有年或月的情况下才显示月
  if (days > 0 || months > 0 || years > 0) parts.push(days + '天'); // 只有在有更高单位时才显示天
  if (hours > 0 || days > 0 || months > 0 || years > 0) parts.push(hours + '时');
  if (minutes > 0 || hours > 0 || days > 0 || months > 0 || years > 0) parts.push(minutes + '分');
  if (seconds > 0 || (!years && !months && !days && !hours && !minutes)) parts.push(seconds + '秒');
  return parts.join('') || '0秒';
}


// 字符串转数组
methods.splitStr = (str = '', fh = ',') => {
  if(!str) return []
  if(!str.includes(fh)) {
    return [str]
  } else {
    return str.split(fh)
  }
}

// 获取两个数组不交集
methods.symmetricDifference = (a, b) => {
  const setA = new Set(a);
  const setB = new Set(b);
  return [...a, ...b].filter(x => !(setA.has(x) && setB.has(x)));
}

// 获取表单验证失败信息
methods.printFormError = (arr = []) => {
  let message = ''
  for(let i in arr) {
    message = arr[i][0].message
  }
  return message
}
// 深度科隆
const deepClone = (obj) => {
  // 处理基本类型和 null
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }

  // 处理数组
  if (Array.isArray(obj)) {
    return obj.map(item => deepClone(item));
  }

  // 处理对象
  const clonedObj = {};
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      clonedObj[key] = deepClone(obj[key]);
    }
  }

  // 处理函数
  if (typeof obj === 'function') {
    return obj.bind(clonedObj);
  }

  return clonedObj;
}
methods.deepClone = deepClone

methods.typeDetect = (value) => {
  if (Array.isArray(value)) {
    return "Array";
  } else if (value && typeof value === 'object') {
    return "Object";
  } else {
    return "Other Type";
  }
}


methods.toFixedTwo = (num) => {
  num = Number(num)
  if (typeof num !== 'number' || isNaN(num)) return 0.00;
  const rounded = Math.round(num * 100) / 100; // 四舍五入保留两位小数
  return rounded.toFixed(2); // 确保保留两位小数，返回 number 类型
}

methods.stringToHexColor = (str) => {
  if (!str) return '';

  // 使用djb2哈希算法
  let hash = 5381;
  for (let i = 0; i < str.length; i++) {
    hash = (hash * 33) ^ str.charCodeAt(i);
  }

  // 使用黄金分割比例来增加色相差异
  const goldenRatio = 0.61803398875;
  const hue = Math.floor((hash * goldenRatio * 360) % 360);

  // 降低亮度范围，使颜色更暗
  const saturation = ((hash % 1) + 70) + '%'; // 范围: 70% ~ 99%
  const lightness = ((hash % 15) + 35) + '%'; // 范围: 35% ~ 49% (降低并缩小范围)

  return `hsl(${hue}, ${saturation}, ${lightness})`;
}

// 获取品牌背景色
methods.getBrandBGC = (brand) => {
  if(!brand) return
  const obj = {
    '马登工装': '#767c85',
    '马登男鞋': '#feb238',
    '马登女装': '#a686f0',
    '工装': '#767c85',
    '男鞋': '#feb238',
    '女装': '#a686f0',
  }

  return obj[brand]
}

// 返回活跃排序
methods.getActiveSort = (queryParams, prop, sort) => {
  if(queryParams.number === prop && queryParams.sort === sort) {
    return '#1a9fff'
  }else {
    return ''
  }
}

// 格式化金额
methods.formatMoney = (number) => {
  if(!number) number = 0
  // 将数字乘以100，四舍五入后再除以100
  const fixedNumber = Math.round(parseFloat(number) * 100) / 100;

  // 转为字符串并分割整数和小数部分
  const parts = fixedNumber.toString().split('.');

  // 确保小数部分有两位
  if (parts.length === 1) {
    return parts[0] + '.00';
  }
  if (parts[1].length === 1) {
    return parts[0] + '.' + parts[1] + '0';
  }
  return parts[0] + '.' + parts[1];
}

// 去掉所有空格与回车
methods.removeWhitespace = (str) => {
  return str.replace(/[\s\n\r]/g, '');
}

// 转换百分比
methods.getPercentage = (val, unit = 2) => {
  let num = val || 0
  return (num * 100).toFixed(unit) + '%'
}
methods.getPdf = (title = 'pdf', id) => {
  if (!id) return;

  return new Promise((resolve) => {
    setTimeout(() => {
      const pdfContent = document.getElementById(id);
      if (!pdfContent) return;

      // A4 尺寸与边距配置（mm）
      const A4_WIDTH = 210;
      const MARGIN = 10;
      const USEABLE_WIDTH = A4_WIDTH - 2 * MARGIN; // 可用宽度

      html2Canvas(pdfContent, {
        logging: false,
        useCORS: true,
        scale: 2, // 提高清晰度
      }).then((canvas) => {
        const imgData = canvas.toDataURL("image/jpeg", 1.0);
        const imgWidth = canvas.width;
        const imgHeight = canvas.height;

        // 计算内容宽高比
        const imgRatio = imgHeight / imgWidth;

        // 计算内容在 PDF 中的实际显示高度（保持宽高比）
        const displayHeight = USEABLE_WIDTH * imgRatio;

        // 创建 PDF 实例（高度设为计算值，实现单页自适应）
        const pdf = new jsPDF("p", "mm", [A4_WIDTH, displayHeight + 2 * MARGIN]);

        // 添加图像（宽度固定，高度自适应）
        pdf.addImage(
          imgData,
          "JPEG",
          MARGIN,
          MARGIN,
          USEABLE_WIDTH,
          displayHeight
        );
        // 保存 PDF
        pdf.save(`${title}.pdf`);

        resolve(1)
      });
    }, 100)
  })
};


export default methods
